//
//  MemoryManagementViewController.swift
//  test_swift
//
//  Created by fangyuan ding on 2021/6/1.
//

import UIKit
protocol Actions :AnyObject {}
class MemoryManagementViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

//        class Cat {}
//
//
//        weak var c0: Cat?
//        weak var c1: AnyObject?
//        weak var c3: Actions?
//
//        unowned var c4: Cat?
//        unowned var c5: AnyObject?
//        unowned var c6: Actions?
        
        
//        class Cat {
//            var name: String?
//            init(name:String?) {
//                self.name = name;
//            }
//            func eat() {}
//        }
//        autoreleasepool {
//            let cat = Cat(name: "zhangsan")
//            cat.eat()
//        }
        //闭包表达式默认会对用到的外层对象产生额外的强引用（对外层对象进行了retain操作）
//        class Person {
//            var fn:(() -> ())?
//            func run() {
//                print("run")
//            }
//            deinit {
//                print("deinit")
//            }
//        }
//        func test() {
//            let p = Person()
//            p.fn = {
//                p.run()
//            }
//        }
     
        

//        func test() {
//            let p = Person()
//            p.fn = {
//                [weak p] in
//                p?.run()
//            }
//        }
   

//        func test() {
//            let p = Person()
//            p.fn = {
//                [unowned p] in
//                p.run()
//            }
//        }
        
//            print(1)
//            test()
//            print(2)
//
//        func test() {
//            let p:Person? = Person()
//            p?.fn = {
//                [weak p] in
//                p?.run()
//            }
//        }
//
//        func test() {
//            let p:Person? = Person()
//            p?.fn = {
//                [unowned p] in
//                p?.run()
//            }
//        }
//
//        class Person {
//            lazy var fn:(() -> ()) = {
//                self.run()
//            }
//            func run() {
//                print("run")
//            }
//            deinit {
//                print("deinit")
//            }
//        }
//        func test() {
//            let p = Person()
//        }
//
        //不存在内存访问冲突
        func plus(_ num: inout Int) -> Int {
            num + 1
        }
        var number = 1
        number = plus(&number)
        print(number);

        //存在内存访问冲突
        var step = 1
        func increment(_ num: inout Int) {
            num += step
        }
        var temp = step
        increment(&temp)
        step = temp
        print(step);
    }
    

  

}
